package Dao.PostgreSql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import Dao.GenericDao;
import Entity.Cliente;
import Interface.InterfaceDao;

public class ClientePostgreSqlDao  extends GenericDao implements InterfaceDao {
	
	@Override
    public List<Object> findAll() {
        List<Object> lista = new ArrayList<Object>();
        try {
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = "select * from Cliente";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);

            // executa o sql
            ResultSet q = preparedStmt.executeQuery();

            Cliente f;
            while (q.next()) {
                f = new Cliente();
                f.setId(q.getInt("id"));
                f.setNome(q.getString("nome"));
                f.setRg(q.getLong("rg"));
                f.setCpf(q.getLong("cpf"));
                f.setDataNasc(q.getDate("dataNascimento"));
                f.setEmail(q.getString("email"));
                
                lista.add(f);
            }

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao consultar todos!");
            System.err.println(e.getMessage());
        }
        return lista;
    }
	
	@Override
    public List<Object> findClienteAviso() {
        List<Object> lista = new ArrayList<Object>();
        try {
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = "select * from Cliente where aviso > ?";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);
            preparedStmt.setInt(1, 0);

            // executa o sql
            ResultSet q = preparedStmt.executeQuery();

            Cliente f;
            while (q.next()) {
                f = new Cliente();
                f.setId(q.getInt("id"));
                f.setNome(q.getString("nome"));
                f.setRg(q.getLong("rg"));
                f.setCpf(q.getLong("cpf"));
                f.setDataNasc(q.getDate("dataNascimento"));
                f.setEmail(q.getString("email"));
                f.setAviso(q.getInt("aviso"));
                lista.add(f);
            }

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao consultar todos!");
            System.err.println(e.getMessage());
        }
        return lista;
    }

    @Override
    public void insert(Object obj) {
        try {
            Cliente objF = (Cliente)obj;
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = " insert into Cliente values (default,?,?,?,?,?)";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);
            preparedStmt.setString(1, objF.getNome());
            preparedStmt.setLong(2, objF.getRg());
            preparedStmt.setLong(3, objF.getCpf());
            preparedStmt.setDate(4, new Date(objF.getDataNasc().getTime()));
            preparedStmt.setString(5, objF.getEmail());

            // executa o sql
            preparedStmt.execute();

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao inserir!");
            System.err.println(e.getMessage());
        }
    }

    @Override
    public void update(Object obj) {
        try {
            Cliente objF = (Cliente)obj;
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = " update cliente set nome = ?, rg = ?, cpf = ?, \"dataNascimento\" = ?, \"email\" = ? where (id = ?)";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);
            preparedStmt.setString(1, objF.getNome());
            preparedStmt.setLong(2, objF.getRg());
            preparedStmt.setLong(3, objF.getCpf());
            preparedStmt.setDate(4, new Date(objF.getDataNasc().getTime()));
            preparedStmt.setString(5, objF.getEmail());
            preparedStmt.setInt(6, objF.getId());

            // executa o sql
            preparedStmt.execute();

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao alterar!");
            System.err.println(e.getMessage());
        }
    }
    
    @Override
    public void updateAviso(int aviso, int id) {
        try {
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = " update cliente set \"aviso\" = ? where (id = ?)";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);
            preparedStmt.setInt(1, aviso);
            preparedStmt.setInt(2, id);

            // executa o sql
            preparedStmt.execute();

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao alterar!");
            System.err.println(e.getMessage());
        }
    }

    @Override
    public void delete(int id) {
        try {
            //cria o objeto de conexao
            Connection conn = conexao();

            // monta o sql de insert
            String query = " delete from Cliente where id = ?";

            // cria os parametros a serem passados no insert
            PreparedStatement preparedStmt = conn.prepareStatement(query);
            preparedStmt.setInt(1, id);

            // executa o sql
            preparedStmt.execute();

            conn.close();
        } catch (Exception e) {
            System.err.println("Ocorreu um erro ao excluir!");
            System.err.println(e.getMessage());
        }
    }

	@Override
	public List<Object> findAllById(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object> findVencimentos(int dias) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object> findVencimentosMes() {
		// TODO Auto-generated method stub
		return null;
	}
}
